简介
Android 6.0(API level 23)引入了两个新特性,当设备没有连接到电源时,通过管理应用程序的行为来延长电池的寿命。当设备闲置了很长一段时间,Doze模式通过延迟后台CPU和网络活动来减少电量消耗。当用户最近和App没有互动时,App Standby模式会延迟App的后台网络活动。
Doze和APP Standby模式测试
为了确保完美的用户体验,开发者应该在这两种模式下充分测试自己的App。
进入Doze模式
- 准备一台安装了Android 6.0系统的设备
- 在开发机器上连接你的设备,然后安装应用
- 运行应用
- 关闭设备屏幕
- 通过命令行进入Doze模式
1 | $ adb shell dumpsys battery unplug |
进入App Standby模式
前三步和进入Doze模式的步骤一样,只是不需要关闭屏幕。
通过命令行进入App Standby模式
1 | $ adb shell dumpsys battery unplug |
通过命令唤醒App
1 | $ adb shell am set-inactive <packageName> false |
App Standby模式对推送的影响
在Doze模式和Standby模式下,第三方推送将会被废,唯一能用的就是Google的GCM。看起来Google希望通过Doze和App Standby来强推GCM。
此处重点研究App Standby模式。通过几个Demo测试,得出以下结果:
- 通过startService启动PushService无法把应用从Standby模式唤醒。
- 先杀死PushService再startService也是不可行的。
- 通过启动应用然后再杀死是可行的,但是会对用户进行干扰。如果选择半夜偷偷启动应用再杀死,未免太过猥琐。
Google在最后关头为开发者提供了一个例外方案:应用可以声明REQUEST_IGNORE_BATTERY_OPTIMIZATIONS权限,并主动要求用户将其加入至白名单中,从而不受Doze Mode和App Standby的影响。